package com.util;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

public class FileComm{

  //------------------------------------------------------
  // 新建目录
  // @param folderPath 目录
  // @return 返回目录创建后的路径
  //-----------------------------------------------------
  public static boolean createFolder(String folderPath) throws CommException{
      String txt = folderPath;
      try{
          java.io.File myFilePath = new java.io.File(txt);
          txt = folderPath;
          if (!myFilePath.isFile()){
            if (!myFilePath.exists()){
              myFilePath.mkdir();
              return true;
            }else{
              throw new CommException("目录已经存在");
              //return false;
            }
          }else{
            throw new CommException("存在同名文件,创建失败");
            //return false;
          }
      }catch (Exception e){  
        throw new CommException(e.getMessage());
        //return false;
      }
      //return false;
  }// createFolder
//
//  //------------------------------------------------------
//  // 深层建目录
//  // @param folderPath 目录
//  // @return 返回目录创建后的路径
//  //-----------------------------------------------------
//  public static boolean createDeepFolder(String folderPath) throws CommException{
//	  boolean rtn = false;
//	  //提取上层判断是否存在
//	  int lastPrt = folderPath.lastIndexOf("\\");
//	  String prtFolder = StringUtils.substring(folderPath, 0, lastPrt);
//
//      File myFilePath = new java.io.File(folderPath);
//      java.io.File prtFolder = new File()
//	  if (!myFilePath.exists()){
//          myFilePath.mkdir();
//          return true;
//        }
//	  return rtn;
//  }
  //------------------------------------------------------
  // 删除目录
  // @param folderPath 目录
  // @return 返回目录创建后的路径
  //-----------------------------------------------------
  public static boolean deleteFolder(String folderPath) throws CommException{
    String txt = folderPath;
    try{
      java.io.File myFilePath = new java.io.File(txt);
      txt = folderPath;
      if (myFilePath.exists()){
        if (myFilePath.isDirectory()){
          delAllFile(folderPath); //删除完里面所有内容
          myFilePath.delete();
          return true;
        }else{
          throw new CommException("目录不存在");
          //return false;
        }
      }else{
        throw new CommException("目录不存在");
        //return false;
      }
    }catch (Exception e){  
      throw new CommException(e.getMessage());
      //return false;
    }
    //return false;
  }// deleteFolder


  //------------------------------------------------------
  // 删除指定文件夹下所有文件
  //@param path 文件夹完整绝对路径
  // @return 返回目录创建后的路径
  //-----------------------------------------------------
  private static boolean delAllFile(String path) {
   boolean bea = false;
      File file = new File(path);
      if (!file.exists()) {
          return bea;
      }
      if (!file.isDirectory()) {
          return bea;
      }
      String[] tempList = file.list();
      File temp = null;
      for (int i = 0; i < tempList.length; i++) {
          if (path.endsWith(File.separator)) {
              temp = new File(path + tempList[i]);
          }else{
              temp = new File(path + File.separator + tempList[i]);
          }
          if (temp.isFile()) {
              temp.delete();
          }
          if (temp.isDirectory()) {
              delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件
              temp.delete();
              bea = true;
          }
      }
      return bea;
  }//delAllFile

  //------------------------------------------------------
  // 程序： fDeleFile
  // 描述： 删除文件 
  // 参数： strLink—— 路径
  //-----------------------------------------------------
  public static boolean fDeleFile(String strLink) throws CommException{
    File file=new File(strLink);                
    if (file.exists()){
      if (file.isFile()){
        return file.delete();
      }else{        
        throw new CommException("文件不存在");
      }
    }else{
      throw new CommException("文件不存在");
    }
  }//fDeleFile

  //------------------------------------------------------
  // 程序： fReName
  // 描述： 删除文件 
  // 参数： strLink—— 路径
  //-----------------------------------------------------
  public static boolean fReName(String strLink,String NewName) throws CommException{
    File file=new File(strLink);
    File newfile=new File(NewName);
    if (file.exists()){
      if (file.isFile()){
        if (!newfile.exists()){
          return file.renameTo(newfile);
        }else{
          String path = newfile.getParent()+"/";
          String NewFileName=fGetNewFileName(newfile.getName(),path);
          newfile=new File(path + NewFileName);
          return file.renameTo(newfile);        
        }
      }else{
        if (file.isDirectory()){
          if (!newfile.exists()){
            return file.renameTo(newfile);
          }else{
            throw new CommException("目录已经存在");
          }
        }else{
          throw new CommException("文件不存在");
        }//if file.isDirectory()
      }
    }else{
      throw new CommException("文件不存在");
    }
  }//fReName

  //------------------------------------------------------
  // 程序： fGetNewFileName
  // 描述： 判断文件如果重名改名为名字加数字
  //        例:test.jpg 存在,上传同名文件会变成test(1).jpg,如果test(1).jpg存在,则变为test(2).jpg
  // 参数： strLink—— 路径
  //        strFileName -- 文件名
  //        RealPath -- 真实路径
  //-----------------------------------------------------
  public static String fGetNewFileName(String strFileName,String RealPath){
    String FileName = strFileName;
    String ArrFile[];
    ArrFile= FileName.split("[.]");
    String FileType = ArrFile[ArrFile.length-1];
    String sFileName = FileName;
    int intI=1;
    File file=new File(RealPath + FileName);                
    while (file.exists()){
      int FileNameLen=FileName.indexOf(".");
      if (FileNameLen >= 0){
        sFileName=FileName.substring(0,FileNameLen)+"("+intI+")"+"."+FileType;
      }
      else{
        sFileName=sFileName+"("+intI+")";   
      }      
      intI++;
      file=new File(RealPath + sFileName);
    }// while (file.exists())
    return sFileName;
  }//fGetNewFileName
  
  /**
   * 提取指定目录下所有文件列表（遍列子目录）
   * @param folderPath
   * @return
   */
  public static List<File> fGetAllFiles(String folderPath){
	  List<File> lstFiles = new ArrayList<File>();
	  fGetAllFiles(folderPath,lstFiles);
	  return lstFiles;
  }

  /**
   * 重载核心方法，递归遍列子目录下的文件列表
   * @param folderPath
   * @param lstFiles
   */
  public static void fGetAllFiles(String folderPath,List<File> lstFiles){
	  File fileObj = new File(folderPath);

      if (!fileObj.exists()){
    	  //文件不存在，直接返回
    	  return ;
      }
	  if (!fileObj.isDirectory()) {
		  lstFiles.add(fileObj);
		  return;
	  }
      String[] tempList = fileObj.list();
      File temp = null;
      for (int i = 0; i < tempList.length; i++) {
          if (folderPath.endsWith(File.separator)) {
              temp = new File(folderPath + tempList[i]);
          }else{
              temp = new File(folderPath + File.separator + tempList[i]);
          }
          if (temp.isDirectory()) {
        	  //递归 获取子目录下的文件
        	  String newFolder = folderPath+"/"+ tempList[i];
        	  fGetAllFiles(newFolder,lstFiles);
          }
          if (temp.isFile()) {
        	  lstFiles.add(temp);
          }
      }
  }// fGetAllFiles
  
}//FileComm